import axios from 'axios'
import qs from 'qs'
import { ElMessage } from 'element-plus'

// 当前环境
const isDev = process.env.NODE_ENV === 'development';

const SUCCESS_CODE = 0;
// 添加响应拦截器, 需要可添加，不需要可以不看这里，

axios.interceptors.request.use(
  config => {
    if (config.method === 'get') {
      //如果是get请求，且params是数组类型如arr=[1,2]，则转换成arr=1&arr=2
      config.paramsSerializer = function (params) {
        return qs.stringify(params, { arrayFormat: 'repeat' })
      }
    }
    return config;
  },
  error => {
    // 错误处理
    console.log(error);
  }
);

axios.interceptors.response.use(
  config => {
    return config;
  },
  error => {
    // 错误处理
    ElMessage.error("服务器开小差啦~");
    console.log(error);
  }
);

// axios + promise 封装 有待重构
export default {
  get(url, data, responseType) { // url: 接口；路径；data: 请求参数；responseType：相应的数据类型，不传默认为json
    return new Promise((resolve, reject) => {
      axios({
        method: 'get',
        url,
        params: data, // get 请求要用 params,而 post 使用 data
        headers: {
          Accept: 'application/json',
          'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8',
          withCredentials: true,
        },
        //默认json格式，如果是下载文件，需要传 responseType:'blob'
        responseType: (responseType == null || responseType == '') ? 'json' : responseType
      }).then(response => {
        if (response) {
          // response 是一个http请求返回的完整报文 其中的data才为我们需要的业务数据
          if (response.status == 200) {
            // 请求成功
            resultHandle(response, resolve, reject);
          } else {
            if (reject && typeof reject === 'function') {
              reject(response);
            } else {
              defaultReject(response.data);
            }
          }
        }
      })
    }).catch((error) => {
      console.log(error)
    })
  },
  // url: 接口；路径；data: 请求参数；contentType：参数类型 form='application/x-www-form-urlencoded' json='application/json; charset=utf-8'；
  // responseType：相应的数据类型，不传默认为json
  post(url, data, responseType) {
    return new Promise((resolve, reject) => {
      axios({
        method: 'post',
        url,
        data,
        headers: {
          Accept: 'application/json',
          'Content-Type': 'application/json; charset=utf-8',
          withCredentials: true,
        },
        //默认json格式，如果是下载文件，需要传 responseType:'blob'
        responseType: (responseType == null || responseType == '') ? 'json' : responseType
      }).then(response => {
        if (response) {
          // response 是一个http请求返回的完整报文 其中的data才为我们需要的业务数据
          if (response.status == 200) {
            // 请求成功
            resultHandle(response, resolve, reject);
          } else {
            if (reject && typeof reject === 'function') {
              reject(response.data);
            } else {
              defaultReject(response.data);
            }
          }
        }
      })
    })
  },
  postParamsWithObj(url, data, responseType) {
    let paramArr = [];
    for (let key in data) {
      let value = data[key]
      // 去掉为空的参数
      if (['', undefined, null].indexOf(value) >= 0) {
        continue;
      }
      // 如果值为数组，另行处理
      if (value.constructor === Array) {
        // 结果: ids=1&ids=2&ids=3
        value.forEach(_value => {
          paramArr.push(key + '=' + _value)
        })
      } else {
        paramArr.push(key + '=' + value)
      }
    }

    return new Promise((resolve, reject) => {
      axios({
        method: 'post',
        url,
        data: paramArr.join('&'),
        headers: {
          Accept: 'application/json',
          'Content-Type': 'application/x-www-form-urlencoded',
          withCredentials: true,
        },
        //默认json格式，如果是下载文件，需要传 responseType:'blob'
        responseType: (responseType == null || responseType == '') ? 'json' : responseType
      }).then(response => {
        if (response) {
          // response 是一个http请求返回的完整报文 其中的data才为我们需要的业务数据
          if (response.status == 200) {
            // 请求成功
            resultHandle(response, resolve, reject);
          } else {
            if (reject && typeof reject === 'function') {
              reject(response.data);
            } else {
              defaultReject(response.data);
            }
          }
        }
      })
    })
  },
  postParams(url, paramStr, responseType) {
    return new Promise((resolve, reject) => {
      axios({
        method: 'post',
        url,
        data: paramStr,
        headers: {
          Accept: 'application/json',
          'Content-Type': 'application/x-www-form-urlencoded',
          withCredentials: true,
        },
        //默认json格式，如果是下载文件，需要传 responseType:'blob'
        responseType: (responseType == null || responseType == '') ? 'json' : responseType
      }).then(response => {
        if (response) {
          // response 是一个http请求返回的完整报文 其中的data才为我们需要的业务数据
          if (response.status == 200) {
            // 请求成功
            resultHandle(response, resolve, reject);
          } else {
            if (reject && typeof reject === 'function') {
              reject(response.data);
            } else {
              defaultReject(response.data);
            }
          }
        }
      })
    })
  }
}

// 全局请求结果处理 对失败请求reject交给之后的catch处理
function resultHandle(respongse, resolve, reject) {
  // 后台通过BaseResult包装的请求结果
  let result = respongse.data;
  if (result != null && result.code != null && result.code != undefined) {
    if (result.code !== SUCCESS_CODE || !result.success) {
      ElMessage.error(result.msg);
      reject(result);
    } else {
      if (result.msg) {
        ElMessage.success(result.msg);
      }
      resolve(result.data);
    }
  } else {
    // 直接返回的数据
    resolve(respongse.data);
  }
}

// 默认的请求失败处理 若需要处理失败请求请在promise构造函数中定义reject
function defaultReject(response) {
  if (isDev) {
    // 开发环境打印服务器返回报文
    console.log("服务器出错:");
    console.log(response);
  }
}